home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
cpptask.exe
/
TSIO.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1991-08-20
|
3KB
|
131 lines
/*
Test program for checking the CTask serial I/O interface.
*/
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <process.h>
#include "task.hpp"
#include "tsklocal.hpp"
#include "sio.hpp"
#define COM1PORT 0x80 /* COM1, relative */
#define COM2PORT 0x81 /* COM2, relative */
#define BAUD 9600L /* Baudrate */
#define STACKSIZE 2048
unsigned int _stklen = 3 * STACKSIZE; /* Two tasks + main Task Stack */
void far task1 (void);
local char stack1 [STACKSIZE];
local task tcb1((funcptr)task1, (byteptr)stack1, STACKSIZE, PRI_STD, NULL);
void far task2 (void);
local char stack2 [STACKSIZE];
local task tcb2((funcptr)task2, (byteptr)stack2, STACKSIZE, PRI_STD, NULL);
flag halt;
word rcvbuf [10000]; // receive buffer for serial port
byte xmtbuf [100]; // transmit buffer for serial port
commport com1(COM1PORT, 1, rcvbuf, sizeof(rcvbuf), // create com1 port
xmtbuf, sizeof(xmtbuf));
int endrun, err;
/*
Task 1 reads characters from the serial line and displays them on
the screen. While the halt flag is set, characters are not read,
so the XON/XOFF and RTS/CTS protocol can be tested for the receiving
side.
*/
void far task1 (void)
{
word ch;
printf ("Task 1 started\n");
while (!endrun)
{
halt.wait_flag_clear (0L);
if (endrun)
return;
ch = com1.receive (0L);
putch (ch);
if (ch & 0xff00)
{
err = 1;
printf ("\n%c*%02x*", ch, ch >> 8);
}
}
}
/*
Task 2 reads characters from the keyboard and sends them to the
serial port. If 'h' is entered, the halt flag is set, so task1
stops reading. If 'c' is entered, the halt flag is cleared.
Entering 'e' stops the program.
*/
void far task2 (void)
{
int ch;
printf ("Task 2 started\n");
while (!endrun)
{
ch = t_read_key () & 0xff;
switch (tolower (ch))
{
case 'h': halt.set_flag ();
puts ("-halt-");
break;
case 'c': halt.clear_flag ();
err = 0;
puts ("-continue-");
break;
case 'e': puts ("-end-");
endrun = 1;
halt.clear_flag ();
main_tcb.wake_task ();
break;
default: com1.send (ch, 0L);
break;
}
}
}
main ()
{
endrun = 0;
com1.change_baud (BAUD);
tcb1.start_task ();
tcb2.start_task ();
tasker.preempt_on ();
t_delay (0L);
endrun = 1;
puts ("******** Main Task *********");
main_tcb.set_priority (10);
tasker.schedule ();
tasker.preempt_off ();
puts ("******** End Run *********");
return 0;
}